package com.fzkj.juc.list;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @DESCRIPTION 模拟set集合安全问题
 */
public class SetDemo {

    public static void main(String[] args) {
//        set_notSafe();
        set_safe();
    }

    /**
     * 不安全
     *
     * 1、现象
     *   java.util.ConcurrentModificationException
     * 2、原因
     *
     * 3、解决
     *   参考ArrayListDemo
     *     - 1、Collections.synchronizedSet 进行包装
     *     - 2、使用
     */
    public static void set_notSafe(){
        Set set = new HashSet<>();
        // 解决方案一
//        Set<Object> objects = Collections.synchronizedSet(new HashSet<>());
        // 解决方案二
        CopyOnWriteArraySet<Object> objects = new CopyOnWriteArraySet<>();
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                set.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(set);
            }, String.valueOf(i)).start();
        }
    }

    public static void set_safe(){
        CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>();
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                set.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(set);
            }, String.valueOf(i)).start();
        }
    }
}
